package com.youdianstar.app.api

import com.youdianstar.app.entity.CodeListRes
import com.youdianstar.app.entity.AccountEdit
import com.youdianstar.app.entity.AccountLoginReq
import com.youdianstar.app.entity.SendCodeRequest
import com.youdianstar.app.entity.MobileLoginRequest
import com.youdianstar.app.entity.MobileLoginResponse
import com.youdianstar.app.entity.UserCenterResponse
import com.youdianstar.app.entity.*
import com.youdianstar.app.common.entity.*
import com.youdianstar.app.common.network.BaseService
import com.youdianstar.app.common.network.model.BasePagingResp
import com.youdianstar.app.common.network.model.BaseResponse
import retrofit2.http.*


/**
 * File: ApiService
 * Author: 82149 Create: 2021/9/24 16:47
 * Changes (from 2021/9/24)
 * --------------------------------------------------
 * description: Retrofit2.0 接口
 * ---------------------------------------------------
 *
 */
interface ApiService : BaseService{

    /**
     * 获取国家编号
     */
    @GET("api/login/country")
    suspend fun getPhoneCodeList(): BaseResponse<CodeListRes>

    /**
     * 获取国家编号
     * ---> IP 默认
     */
    @GET("api/login/country/current")
    suspend fun getPhoneCodeCurrent(): BaseResponse<PhoneCurrent>

    /**
     * 发送手机登录验证码
     * @param countryCode 国家代码，如 "84" (越南)
     * @param phoneNumber 手机号码
     * @param type 验证码类型，登录时使用 'login'
     */
    @FormUrlEncoded
    @POST("sw/app/mobile/login/send_code")
    suspend fun getOTPCode(@Field("countryCode") countryCode: String, @Field("phoneNumber") phoneNumber: String, @Field("type") type: String): BaseResponse<Any>

    /**
     * 手机号验证码登录
     * @param countryCode 国家代码，如 "84" (越南)
     * @param phoneNumber 手机号码
     * @param securityCode 验证码
     */
    @FormUrlEncoded
    @POST("sw/app/mobile/login")
    suspend fun loginAccount(@Field("countryCode") countryCode: String, @Field("phoneNumber") phoneNumber: String, @Field("securityCode") securityCode: String): BaseResponse<MobileLoginResponse>

    /**
     * 账号登录 --token登录
     */
    @FormUrlEncoded
    @POST("api/login/login-token")
    suspend fun loginAccountToken(@Field("token") token: String):BaseResponse<UserInfo>

    /**
     * 退出登录
     */
    @DELETE("api/login/log-out")
    suspend fun userLogout() : BaseResponse<Any>

    /**
     * 获取个人中心信息 - 直接返回数据（不包装在BaseResponse中）
     */
    @GET("sw/app/ucenter/index.html/V2")
    suspend fun getUserCenter(): UserCenterResponse

    /**
     * 用户-编辑
     */
    @PUT("api/users")
    suspend fun editUser(@Body userReq: AccountEdit): BaseResponse<Any>

    /**
     * 修改昵称
     */
    @FormUrlEncoded
    @POST("sw/app/userinfo/edit_nickname")
    suspend fun editNickname(@Field("userId") userId: Int, @Field("nickname") nickname: String): BaseResponse<Any>

    /**
     * 校验原账号
     *
     * @param code 国家/地区码
     * @param phone 手机号
     * @param email 邮箱地址
     */
    @GET("api/users/verification-account")
    suspend fun verifyAccount(@Query("code") code: String?, @Query("phone") phone: String?, @Query("email") email: String?,
                              @Query("msgCode") msgCode: String): BaseResponse<Any>


    /**
     * 用户-注销账户
     */
    @DELETE("api/users")
    suspend fun userAccountCancel(): BaseResponse<Any>

    /**
     * 账号 -生物识别信息更新
     *
     * @param req 请求数据
     */
    @POST("api/users")
    suspend fun accountTouchIdSys(@Body req: TouchIDSys): BaseResponse<Any>

    /**
     * 判断App版本号
     *
     * @param state Android-0
     * @param v1 1.0.0
     * @param v2 1.0.0
     */
    @GET("api/login/version/{state}/{v1}/{v2}")
    suspend fun checkVersionUpdate(@Path("state") state:String,@Path("v1") v1:String,@Path("v2") v2:String):BaseResponse<VersionUpdate>

    /**
     * 网点列表 分页 - 新接口
     * @param lng 经度
     * @param lat 纬度
     * @param distance 距离范围
     * @param total 总数限制
     */
    @GET("sw/app/site/around/list/V2")
    suspend fun getMapBranchList(@Query("lng") lng: Double,
                              @Query("lat") lat: Double,
                              @Query("distance") distance: Int = 5,
                              @Query("total") total: Int = 200): BaseResponse<List<SiteInfo>>

    /**
     * 网点列表 分页 (旧接口)
     *
     * @param offset 偏移量
     * @param type 网点类型：null-全部 1-可租借 2-可归还
     */
    @GET("api/branches/{lng}/{lat}")
    suspend fun getBranchList(@Path("lng") lng: Double,
                              @Path("lat") lat: Double,
                              @Query("offset") offset: Int?,
                              @Query("search") searchKey: String?,
                              @Query("type") type: Int?): BasePagingResp<List<BranchInfo>>

    /**
     * 网点列表 - 新接口（分页版本）
     * @param lng 经度
     * @param lat 纬度
     * @param search 搜索关键词
     * @param type 网点类型：null-全部 1-可租借 2-可归还
     * @param distance 距离范围
     * @param total 总数限制
     */
    @GET("sw/app/site/around/list/V2")
    suspend fun getBranchListV2(@Query("lng") lng: Double,
                              @Query("lat") lat: Double,
                              @Query("search") search: String?,
                              @Query("type") type: Int?,
                              @Query("distance") distance: Int = 5,
                              @Query("total") total: Int = 200): BaseResponse<List<SiteInfo>>

    /**
     * 获取网点详情 - 新接口
     */
    @GET("sw/app/site/detail.html/V2")
    suspend fun getBranchDetails(@Query("siteId") siteId: Int, 
                                 @Query("distance") distance: Double?): BaseResponse<BranchDetailInfo>

    /**
     * 扫码结果 - 查询机柜信息
     * @param deviceId 设备ID
     */
    @GET("sw/app/rentbox/show.html/V2")
    fun getScanResult(@Query("deviceId") deviceId: String): retrofit2.Call<okhttp3.ResponseBody>

    /**
     * 查看用户是否可以租借
     */
    @GET("api/users/rent-or-not")
    suspend fun rentOrNot(@Query("sno") sno: String?):BaseResponse<RentCheck>

    /**
     * 获取计费规则
     */
    @GET("api/orders/billing")
    suspend fun getRentPricePlan(@Query("sno") sno: String, @Query("qrUrl") qrContent: String): BaseResponse<ReqStationPlan>

    /**
     * 主页轮询订单
     * 租借中和与未支付订单
     */
    @GET("api/orders/ing")
    suspend fun getRentingOrder() : BaseResponse<OrderQuery>

    /**
     * 租借下单 - 预授权
     */
    @POST("api/orders/credit-rent")
    suspend fun rentOrderPreAuth(@Body req: RentalAuthRequest): BaseResponse<RentalAuthRes>

    /**
     * 租借下单-扫码租借
     */
    @GET("api/orders/rent/{cabinetNo}")
    suspend fun rentOrder(@Path("cabinetNo") cabinetNo: String): BaseResponse<RentResult>

    /**
     * 查询租借结果-进度条页面用
     * @param  orderNo 订单号
     */
    @GET("api/orders/rent-result/{orderNo}")
    suspend fun queryRentResult(@Path("orderNo") orderNo: String): BaseResponse<RentResult>

    /**
     * 订单-订单列表
     * @param offset 偏移量 0开始
     */
    @GET("api/orders/list/{offset}")
    suspend fun getOrderRecord(@Path("offset") offset: Int): BaseResponse<List<Any>>

    /**
     * 新订单列表接口 - 返回包含data字段的JSON对象
     * @param status 订单状态
     */
    @POST("sw/app/rentbox/order/list.html/V2")
    suspend fun getNewOrderList(@Body request: Map<String, Int>): OrderListResponse

    /**
     * 订单-订单号获取详细信息（旧接口，保留兼容性）
     * @param orderNo 订单编号
     */
    @GET("api/orders/{orderNo}")
    suspend fun getOrderDetails(@Path("orderNo") orderNo: String):BaseResponse<OrderInfo>

    /**
     * 订单详情接口 V2
     * @param orderId 订单ID（可以是订单编号或UUID）
     */
    @GET("sw/app/rentbox/order/detail.html/V2")
    suspend fun getOrderDetailV2(@Query("orderId") orderId: String): BaseResponse<OrderDetailInfo>

    /**
     * 上报 -租借失败/归还不结束
     * 前置确认充电宝是否在机柜
     */
    @GET("api/orders/question/{orderNo}")
    suspend fun reportOrderCheck(@Path("orderNo") orderNo: String): BaseResponse<ReportBefore>

    /**
     * 上报 -租借失败/归还不结束
     * @param req 请求数据
     */
    @POST("api/orders/question/order-problem")
    suspend fun reportOrderFailed(@Body req: ReportOrderReq): BaseResponse<Any>

    /**
     * 上报 -报损
     * @param req 请求数据
     */
    @POST("api/orders/question/damage")
    suspend fun reportFaulty(@Body req: ReportFaultyReq): BaseResponse<Any>


    /**
     * 钱包
     */
    @GET("api/users/wallet")
    suspend fun getWallet(): BaseResponse<WalletInfo>

    /**
     * 支付-流水列表
     * @param offset 偏移量 0开始
     */
    @GET("api/users/transfer/{offset}")
    suspend fun getPaymentRecord(@Path("offset") offset: Int): BaseResponse<List<PaymentRecord>>

    /**
     * 支付流水详情
     * @param transferNo 交易单号
     */
    @GET("api/users/transfer/{transferNo}/detail")
    suspend fun getPaymentBillDetail(@Path("transferNo") transferNo: String): BaseResponse<PaymentRecord>

    /**
     * 添加卡
     */
    @POST("api/users/bankcard")
    suspend fun bindCard(@Body bindCardReq: CardBindReq): BaseResponse<Any>

    /**
     * 解绑卡
     */
    @DELETE("api/users/bankcard/{id}")
    suspend fun unBindCard(@Path("id") id: Int): BaseResponse<CardUnbindRes>

    /**
     * 设置默认卡
     */
    @PUT("api/users/bankcard-default")
    suspend fun setDefaultCard(@Body req: CardDefaultReq):BaseResponse<Any>


    /**
     * 获得优惠券列表-我的优惠券(优惠券主页)
     *
     * @param type  0-通用优惠券 1-商家优惠券
     * @param state  null-全部 1-未使用 2-已使用 3-已过期
     * @param offset 偏移量 0开始
     */
    @GET("reward/coupons/my")
    suspend fun getCouponsRecord(@Query("applyType") type: Int?,@Query("state") state: Int?,@Query("offset") offset: Int): BaseResponse<List<CouponRes>>

    /**
     * 获得可兑换优惠券列表-(优惠券中心)
     *
     * @param type 0-通用优惠券 1-商家优惠券
     */
    @GET("reward/coupons")
    suspend fun getCouponsInfo(@Query("applyType") type: Int, @Query("offset") offset: Int): BaseResponse<List<CouponInfo>>

    /**
     * 兑换优惠券-积分
     *
     * @param id 优惠券id
     */
    @POST("reward/coupons/redeem/point/{id}")
    suspend fun redeemCouponInPoints(@Path("id") id: Int):BaseResponse<Any>

    /**
     * 兑换优惠券-优惠码
     */
    @FormUrlEncoded
    @POST("reward/promo-code/redeem")
    suspend fun redeemCouponWithPromo(@Field("code") code: String):BaseResponse<RedeemResult>

    /**
     * 获得优惠码列表-我的优惠码(优惠券主页)
     *
     * @param offset 偏移量 0开始
     */
    @GET("reward/promo-code/my")
    suspend fun getPromoCodeRecord(@Query("offset") offset: Int): BaseResponse<List<CouponRes>>


    /**
     * 获取积分账户
     */
    @GET("reward/points/my")
    suspend fun getMyPoints(): BaseResponse<PointAccount>

    /**
     * 获取积分规则
     */
    @GET("reward/points/rule")
    suspend fun getPointPlans(): BaseResponse<List<PointPlan>>

    /**
     * 获取积分记录
     * @param type 类型：1-增加 2-使用
     */
    @GET("reward/points")
    suspend fun getPointRecord(@Query("type") type: Int,@Query("offset") offset: Int): BaseResponse<List<PointRecord>>

    /**
     * 获取积分规则 -用户绑卡事件
     */
    @GET("api/users/check/band/card")
    suspend fun checkPointsBindAction(): BaseResponse<List<PointDbResult>>


    /**
     * 邀请
     * --获取邀请规则
     */
    @GET("reward/invitation/reward")
    suspend fun getInvitePlans(): BaseResponse<List<InviteInfo>>

    /**
     * 邀请--兑换邀请码
     * @param code 邀请码
     */
    @GET("reward/invitation/invite/{code}")
    suspend fun redeemInvitationCode(@Path("code") code: String):BaseResponse<Any>


    /**
     * 邀请--获取邀请记录
     *
     * @param offset 偏移量
     */
    @GET("reward/invitation/user-reward")
    suspend fun getInvitationRecord(@Query("offset") offset: Int): BaseResponse<List<InviteRc>>

    /**
     * 奖励扫码--扫码兑换
     * @param type 1-优惠券 2-优惠码 3-充电卡
     * @param code 编码
     */
    @GET("reward/coupons/scan")
    suspend fun scanRewardCode(@Query("type") type: Int,@Query("code") code: String):BaseResponse<Any>

    /**
     *  充点卡列表-列表主页
     *
     * @param offset 偏移量 0开始
     */
    @GET("reward/charge-cards")
    suspend fun getChargePlanList(@Query("offset") offset: Int): BaseResponse<List<ChargePlan>>

    /**
     * 充点卡列表-我的充电卡
     *
     * @param offset 偏移量 0开始
     */
    @GET("reward/charge-cards/my")
    suspend fun getChargePlanRecord(@Query("offset") offset: Int): BaseResponse<List<ChargePlan>>


    /**
     * FAQ 问题列表 - 旧接口
     */
    @GET("api/faqs")
    suspend fun getFaqList(): BaseResponse<List<FaqQuestionItem>>

    /**
     * FAQ 问题列表 - 新接口
     */
    @GET("sw/faq/list/V2")
    suspend fun getFaqListV2(): BaseResponse<Any>

    /**
     * 上报
     */
    @POST("api/feedback")
    suspend fun reportFeedback(@Body req: FeedbackReq): BaseResponse<Any>

    //----------------------------------商户中心部分---------------------------------------
    /**
     * 店主入住--邀请链接绑定
     *
     * @param ciphertext 加密文本
     */
    @POST("api/users/branch-owner/invite/{ciphertext}")
    suspend fun merchantLinkAction(@Path("ciphertext") ciphertext: String):BaseResponse<MerchantLink>

    /**
     * 招商加盟提交
     * @param request 请求数据包含name, tel, city, joinNotes
     */
    @POST("sw/app/ucenter/merchants_join/V2")
    suspend fun submitBusinessJoin(@Body request: Map<String, String>): BaseResponse<Any>

    /**
     * 商户中心
     * ---> 首页统计
     * @param rangeTime 开始时间-结束时间
     */
    @GET("api/merchants/home")
    suspend fun getMerchantCenterCount(@Query("branchId") id: Int?,@Query("rangeTime") rangeTime: String?): BaseResponse<OpMerchantHome>


    /**
     * 商户中心--提现
     */
    @POST("api/merchants/withdraws")
    suspend fun requestWithdrawal(@Body req: WithdrawsReq): BaseResponse<Any>

    /**
     * 商户中心-获取关联账户
     */
    @GET("api/merchants/bankcard")
    suspend fun getWithdrawalAccount():BaseResponse<List<CardEntity>>

    /**
     * 商户中心--订单列表
     *
     * @param offset 偏移量 0开始
     */
    @GET("api/merchants/rental-order")
    suspend fun getMerchantOrders(@Query("branchId") id: Int?,@Query("offset") offset: Int): BaseResponse<List<Any>>

    /**
     * 商户中心--分成流水
     *
     * @param offset 偏移量 0开始
     */
    @GET("api/merchants/brokerages")
    suspend fun getMerchantTrans(@Query("branchId") id: Int?,@Query("offset") offset: Int): BaseResponse<List<OpTransaction>>

    /**
     * 商户中心
     * ---> 分成统计
     */
    @GET("api/merchants/brokerages/summary")
    suspend fun getMerchantTransCount(@Query("branchId") id: Int?): BaseResponse<OpTransCount>

    /**
     * 商户中心--提现记录
     *
     * @param offset 偏移量 0开始
     */
    @GET("api/merchants/withdraws")
    suspend fun getWithdrawalRecord(@Query("branchId") id: Int?,@Query("offset") offset: Int): BaseResponse<List<WithdrawalRec>>

    /**
     * 商户中心--设备列表
     *
     * @param offset 偏移量 0开始
     */
    @GET("api/merchants/cabinets")
    suspend fun getDeviceList(@Query("branchId") id: Int?,@Query("offset") offset: Int): BaseResponse<List<DeviceEntity>>

    /**
     * 商户中心--网点列表
     */
    @GET("api/merchants")
    suspend fun getShopList():BaseResponse<List<MerchantOP>>

    /**
     * 商户中心--获取网点详情
     */
    @GET("api/merchants/{branchId}")
    suspend fun getShopDetails(@Path("branchId") branchId: Int):BaseResponse<OpShopInfo>

    /**
     * 商户中心--更新网点详情
     */
    @PUT("api/merchants")
    suspend fun updateShopDetail(@Body req: OpShopRequest):BaseResponse<Any>

    /**
     * 商户中心--获取行业列表
     */
    @GET("api/common/industries")
    suspend fun getShopIndustries():BaseResponse<List<OpIndustry>>


    /*******************************************旧版接口*************************************/

    /**押金提现*/
    @PUT("api/users/refund-deposit")
    suspend fun requestRefund():BaseResponse<CardUnbindRes>

    /**支付获取支付方式*/
    @GET("api/users/paymentMethod/{type}/{amount}")
    suspend fun getPaymentMethod(@Path("type") type: Int,@Path("amount") amount: Double,@Query("orderNo") orderNo: String?): BaseResponse<PaymentMethodResult>

    /**
     * 计算支付金额
     *
     * @param type 流水类型：1-租借 3-会员 5-押金 7-报失 11-优惠券 13-购买 15-置换 17-预付款 19-充电卡
     * @param orderNo 订单号
     * @param userCouponId 用户优惠券id
     */
    @GET("api/orders/calculate-price")
    suspend fun getPaymentPrice(@Query("type") type: Int,@Query("orderNo") orderNo: String?,
                                @Query("userCouponId") userCouponId: Int?, @Query("chargeCardId") chargeCardId: Int?): BaseResponse<OrderInfo>

    /**支付*/
    @POST("api/users/payment")
    suspend fun payment(@Body req: PaymentReq): BaseResponse<PaymentResult>

    /**发送收据*/
    @POST("api/users/receipts")
    suspend fun sendReceipts(@Body req: ReceiptReq):BaseResponse<Any>

    /**
     * ZaloPay押金支付 - App端
     * @param deviceId 设备ID
     * @param powerBankType 充电宝类型
     */
    @GET("sw/app/security/zalopay/V2")
    suspend fun createZaloPayOrder(@Query("deviceId") deviceId: String?, @Query("powerBankType") powerBankType: Int = 0): BaseResponse<String>

    /**
     * 检查支付状态
     * @param orderUuid 订单UUID
     */
    @GET("sw/app/security/pay/check")
    suspend fun checkPaymentStatus(@Query("orderUuid") orderUuid: String): BaseResponse<Any>

    /**
     * 弹出充电宝接口
     * @param deviceId 设备ID
     */
    @GET("sw/app/rentbox/popup")
    suspend fun rentboxPopup(@Query("deviceId") deviceId: String): BaseResponse<Any>

    /**
     * 获取押金支付配置 - 直接返回数据（不包装在BaseResponse中）
     * @param powerBankType 充电宝类型，默认0
     */
    @GET("sw/app/security_pay/configV2")
    suspend fun getSecurityPayConfig(@Query("powerBankType") powerBankType: Int = 0): SecurityPayConfigResponse

    //----------------------------------奖励部分---------------------------------------


    /**
     * 获得优惠券列表-支付使用
     *
     * @param orderNo 支付订单
     */
    @GET("reward/coupons/order")
    suspend fun getCouponList(@Query("orderNo") orderNo: String): BaseResponse<List<CouponRes>>

    /**
     * 优惠码兑换记录(弃用)
     *
     * @param offset
     */
    @GET("reward/promo-code/redeem-history")
    suspend fun getPromoRecords(@Query("offset") offset: Int):BaseResponse<List<PromoRecord>>



}